import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'core/di/service_locator.dart';
import 'core/theme/theme.dart';
import 'presentation/screens/auth/login_screen.dart';
import 'presentation/screens/home/home_screen.dart';
import 'domain/providers/auth_provider.dart';
import 'domain/providers/upload_queue_provider.dart';
import 'domain/providers/backup_provider.dart';
import 'domain/providers/album_provider.dart';
import 'domain/services/directory_service.dart';
import 'domain/services/upload_service.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化依赖注入
  await setupServiceLocator();

  runApp(
    // 使用多个Provider包装应用，提供主题和认证状态管理
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => ThemeProvider()),
        ChangeNotifierProvider(create: (_) => AuthProvider()),
        ChangeNotifierProvider(create: (_) => DirectoryService()),
        // 备份设置状态管理
        ChangeNotifierProvider<BackupProvider>(
          create: (context) => serviceLocator<BackupProvider>(),
          lazy: true, // 确保延迟初始化
        ),
        // 相册管理状态管理
        ChangeNotifierProvider<AlbumProvider>(
          create: (context) => serviceLocator<AlbumProvider>(),
          lazy: true, // 确保延迟初始化
        ),
        // 使用 ProxyProvider 确保 UploadQueueProvider 在其依赖的 Provider 之后初始化
        ChangeNotifierProvider<UploadQueueProvider>(
          create: (context) {
            // 延迟创建，确保不在构建过程中访问其他Provider
            return serviceLocator<UploadQueueProvider>();
          },
          lazy: true, // 确保延迟初始化
        ),
      ],
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();

    // 请求框架会在第一帧渲染后调用此方法
    WidgetsBinding.instance.addPostFrameCallback((_) {
      // 获取认证提供者并设置拦截器
      final authProvider = Provider.of<AuthProvider>(context, listen: false);
      setupAuthInterceptor(authProvider);
    });
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();

    // 获取服务
    final authProvider = Provider.of<AuthProvider>(context);
    final directoryService = Provider.of<DirectoryService>(
      context,
      listen: false,
    );

    // 监听认证状态变化，设置目录服务的认证令牌
    if (authProvider.isAuthenticated && authProvider.accessToken != null) {
      directoryService.setAuthToken(authProvider.accessToken!);
    } else {
      // 如果未认证，重置目录服务状态
      directoryService.reset();
    }
  }

  @override
  Widget build(BuildContext context) {
    // 获取主题提供者
    final themeProvider = Provider.of<ThemeProvider>(context);
    final authProvider = Provider.of<AuthProvider>(context);

    return MaterialApp(
      title: '文件备份',
      // 使用主题提供者中的主题数据
      theme: themeProvider.themeData,
      // 关闭调试标签
      debugShowCheckedModeBanner: false,
      // 根据认证状态显示不同的主页
      home:
          authProvider.isAuthenticated
              ? const HomeScreen()
              : const LoginScreen(),
      // 定义命名路由
      routes: {
        '/login': (context) => const LoginScreen(),
        '/home': (context) => const HomeScreen(),
      },
    );
  }
}
